package Mochila;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author PC27
 */
import java.io.*;
import java.util.Scanner;
import java.util.Vector;

public class Leitor {

   public static void main(String[] args) {
      int i = 0, j = 0, pos, T = 10, Vlr = 0, Pes = 0, K = 0, PesAnt = 0, KAnt = 0;            // Variáveis auxiliares
      int N;                 // Número de items
      int W;                 // Tamanho da mochila
      Vector<Integer> peso;  // Pesos dos items
      Vector<Integer> valor = null; // Valores dos items
      int PopInicial[][];
      int[][] Genetica = null;
      int[][] Final = null;
      // Nosso "scanner" ou leitor de arquivo
       // Criei uma comentario aqui maicon
      Scanner s;

      // Bloco try-catch para tratamento de erros
      try {

         // Abrindo o arquivo
         s = new Scanner(new File(args[0]));

         // Lendo o número de itens da mochila
         N = s.nextInt();

         // Alocando memória para os vetores de peso e valor dos
         // items
         peso = new Vector<Integer>(N);
         valor = new Vector<Integer>(N);

         // Lendo os dados dos itens
         for (i = 0; i < N; i++) {

            // Lendo posição do item
            pos = s.nextInt();

            // Lendo valor e peso do item e adicionando ao vetor
            valor.add(pos - 1, s.nextInt());
            peso.add(pos - 1, s.nextInt());
         }

         // Lendo o tamanho da mochila
         W = s.nextInt();

         // Descomente a linha abaixo para imprimir os valorse dos
         // items lido
         System.out.println("Valor Inicial de W " + W);

         PopInicial = new int[T][N];
         Genetica = new int[T][N];
         Final = new int[T][N];

         for (i = 0; i < T; i++) {
            for (j = 0; j < N; j++) {
               PopInicial[i][j] = (int) (Math.random() * 2);
               System.out.print(PopInicial[i][j]);
            }
            System.out.println("");
         }

         while (K < T) {
            Pes = 0;
            for (j = 0; j < N; j++) {
               if ((PopInicial[K][j]) == 1) {
                  Pes += peso.get(j);
               }
            }

            while (Pes > W) {
               int Ran = (int) (Math.random() * N);
               if ((PopInicial[K][Ran]) == 1) {
                  Pes -= peso.get(Ran);
                  PopInicial[K][Ran] = 0;
               }
            }

            System.out.println("----------------------");
            System.out.println("Posição " + K);
            System.out.println("Peso " + Pes);
            System.out.println("W/2 " + W / 2);
       
            if (Pes < 0) {
               if (Pes > PesAnt) {
                  for (i = 0; i < N; i++) {
                     Final[K][i] = PopInicial[K][i];
                  }
                  PesAnt = Pes;
                  KAnt = K;
               }
            }

            K++;
         }

         for (j = 0; j < N; j++) {
            System.out.print(Final[KAnt][j]);
         }
         System.out.println(""); 
         
         System.out.println("Pes " + Pes );         
         System.out.println("W " + W );   
         if (PesAnt == 0) {
            System.out.println("TEVE QUE FAZER GENETICA");
            K = 0;
            while (K < 1) {
               //MUTACAO GENETICA 1
               int Ran = (int) (Math.random() * T);
               for (i = 0; (i < (N / 2)); i++) {
                  Genetica[K][i] = PopInicial[Ran][i];
               }

               int Ran1 = (int) (Math.random() * T);
               for (j = (N / 2); j < N; j++) {
                  Genetica[K][j] = PopInicial[Ran1][j];
               }
               //MUTACAO GENETICA 1

               System.out.println("MATRIZ GENETICA 1 ");
               for (i = 0; i < N; i++) {
                  System.out.print(Genetica[K][i]);
               }
               System.out.println("");


               //MATRIZ GENETICA
               for (j = 0; j < N; j++) {
                  if ((Genetica[K][j]) == 1) {
                     Pes += peso.get(j);
                  }
               }

               System.out.println("Genetica 1 ANTES " + Pes);
               while (Pes > W) {
                  int Ran2 = (int) (Math.random() * N);
                  if ((Genetica[K][Ran2]) == 1) {
                     Pes -= peso.get(Ran2);
                     Genetica[K][Ran2] = 0;
                  }
               }
               System.out.println("Genetica 1 DEPOIS " + Pes);
               System.out.println("Genetica MATRIZ 1");

               if (Pes > W / 2) {
                  if (Pes > PesAnt) {
                     for (i = 0; i < N; i++) {
                        Final[K][i] = PopInicial[K][i];
                     }
                     PesAnt = Pes;
                     KAnt = K;
                  }
               }

               for (j = 0; j < N; j++) {
                  System.out.print(Genetica[W][j]);
               }
               System.out.println("");

               K++;
            }
         }
      }
      catch (Exception e) {
         // TODO: fazer o tratamento de erros
      }

   }
}
